package com.gao.a_buffer.b;

import org.junit.Test;

import java.nio.ByteBuffer;
import java.util.Arrays;

/**
 * @author gao
 * @time 2020/06/18 10:47:41
 */
public class App {

    // 以下例子证明了：
    // 1. 刚刚创建好的ByteBuffer缓冲区，其中的值默认为0
    // 2. buf.get()方法不但会从ByteBuffer中取出数据，而且还会改变position的值
    @Test
    public void test() {
        ByteBuffer buf = ByteBuffer.allocate(10);
        while(buf.hasRemaining()) {
            System.out.println("position:\t" + buf.position() + " " + buf.get());
        }
    }

    // ByteBuffer的position方法的使用
    @Test
    public void test2() {
        ByteBuffer buf = ByteBuffer.allocate(10);
        buf.put("x".getBytes());
        buf.position(4);
        buf.put("y".getBytes());
        buf.position(9);
        buf.put("z".getBytes());

        buf.position(0);
        byte[] array = buf.array();
        // [120, 0, 0, 0, 121, 0, 0, 0, 0, 122]
        System.out.println(Arrays.toString(array));
    }

    // ByteBuffer的limit方法的使用
    @Test
    public void test3() {
        ByteBuffer buf = ByteBuffer.allocate(10);
        buf.put("abcdefghij".getBytes());

        // 该示例的重点就是下面这两行代码
        buf.position(3);
        buf.limit(6);

        while (buf.hasRemaining()) {
            System.out.println((char)buf.get());
        }
    }

    // 向ByteBuffer中写入数据后，再如何全部读取出来的方法
    @Test
    public void test4() {
        ByteBuffer buf = ByteBuffer.allocate(10);
        buf.put("abcdefg".getBytes());

        buf.limit(buf.position());
        buf.position(0);

        while (buf.hasRemaining()) {
            System.out.print((char)buf.get());
        }

        // 注意，ByteBuffer的array()是一次性把缓冲区中的数据全部取出，它不受limit的影响，不也会影响position和limit
        // 详细见下面的例子
        System.out.println(Arrays.toString(buf.array()));
    }

    // ByteBuffer的array()是一次性把缓冲区中的数据全部取出，且ByteBuffer的array方法不会影响到position和limit的值
    @Test
    public void test5() {
        ByteBuffer buf = ByteBuffer.allocate(10);
        buf.put("1234567890".getBytes());
        System.out.println("position\t" + buf.position());
        System.out.println("limit\t" + buf.limit());
        byte[] array = buf.array();
        System.out.println("content\t" + new String(array));
        System.out.println("position\t" + buf.position());
        System.out.println("limit\t" + buf.limit());
    }
}